home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / NEW_DEF / STRINGEX.I < prev    next >
Encoding:
Text File  |  1994-01-15  |  5.7 KB  |  161 lines

  1. Gruppe: Persönliche
  2. ID  : P22205@K2
  3. Wg. : Case-Insensitive Funktionen
  4. Von : Dirk Steins @ K2 (Fr, 14.01.94 19:27)
  5. An  : Thomas Tempelmann @ M
  6.  
  7. Hi Thomas, hier sind zwei Case-Insensitive Funktionen für Strings:
  8.  
  9. (* Für Case-Insensitive Stringvergleiche *)
  10. PROCEDURE StrIequal (REF s1, s2 : ARRAY OF CHAR): BOOLEAN;
  11. BEGIN
  12.   ASSEMBLER
  13.         MOVE    -(A3),D0
  14.         MOVE.L  -(A3),A0
  15.         MOVE.W  -(A3),D1
  16.         MOVE.L  -(A3),A1
  17.         LEA     tab(PC),A2
  18.         CLR.W   D2
  19.  
  20. l       MOVE.B  (A0)+,D2
  21.         BEQ.S   equ1
  22.         SWAP    D1
  23.         CLR.W   D1
  24.         MOVE.B  0(A2,D2.W),D2
  25.         MOVE.B  (A1)+,D1
  26.         CMP.B   0(A2,D1.W),D2
  27.         BNE.S   ne
  28.         SWAP    D1
  29.         SUBQ.W  #1,D0
  30.         BCS.S   e
  31.         DBRA    D1,l
  32.  
  33.         ; str1 zu Ende, str0 aber nicht
  34.         TST.B   (A0)+
  35.         BEQ.S   equ0
  36.         BRA.S   ne
  37.  
  38. equ1    ; str0 zu Ende, str1 prüfen
  39.         TST.B   (A1)+
  40.         BEQ     equ0
  41.  
  42. ne      CLR     D0
  43.         RTS
  44.  
  45. e       ; str0 zu Ende, str1 prüfen
  46.         TST.W   D1
  47.         BEQ.S   equ0
  48.         TST.B   (A1)+
  49.         BNE.S   ne
  50.  
  51. equ0    MOVE    #1,D0
  52.         RTS
  53.  
  54.   tab:  DC.B $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
  55.         DC.B $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F
  56.         DC.B ' ','!','"','#','$','%','&',$27,'(',')','*','+',',','-','.','/'
  57.         DC.B '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?'
  58.         DC.B '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'
  59.         DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\',']','^','_'
  60.         DC.B '`','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'
  61.         DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','{','|','}','~',''
  62.         DC.B 'Ç','Ü','É','A','Ä','À','Å','Ç','E','E','E','I','I','I','Ä','Å'
  63.         DC.B 'É','Æ','Æ','O','Ö','O','U','U','ÿ','Ö','Ü','¢','£','¥','ß','ƒ'
  64.         DC.B 'A','I','O','U','Ñ','Ñ','ª','º','¿','⌐','¬','½','¼','¡','«','»'
  65.         DC.B 'Ã','Õ','Ø','Ø','Œ','Œ','À','Ã','Õ','¨','´','†','¶','©','®','™'
  66.         DC.B 'IJ','IJ','א','ב','ג','ד','ה','ו','ז','ח','ט','י','כ','ל','מ','נ'
  67.         DC.B 'ס','ע','פ','צ','ק','ר','ש','ת','ן','ך','ם','ף','ץ','§','∧','∞'
  68.         DC.B 'α','ß','Γ','π','Σ','σ','µ','τ','Φ','Θ','Ω','δ','∮','ϕ','∈','∩'
  69.         DC.B '≡','±','≥','≤','⌠','⌡','÷','≈','°','∙','·','√','ⁿ','²','³','¯'
  70.   END
  71. END StrIequal;
  72.  
  73. PROCEDURE StrICompare (REF str0,str1: ARRAY OF CHAR) : MagicStrings.Relation;
  74.   BEGIN
  75.     ASSEMBLER
  76.         MOVE.W  -(A3),D0    ; HIGH (str1)
  77.         MOVE.L  -(A3),A0    ; ADR (str1)
  78.         MOVE.W  -(A3),D1    ; HIGH (str0)
  79.         MOVE.L  -(A3),A1    ; ADR (str0)
  80.         CLR.W   D2
  81.         LEA     tab(PC),A2
  82.  
  83. l       MOVE.B  (A0)+,D2
  84.         BEQ.S   equ1
  85.         MOVE.B  0(A2,D2.W),D2
  86.         SWAP    D1
  87.         CLR.W   D1
  88.         MOVE.B  (A1)+,D1
  89.         CMP.B   0(A2,D1.W),D2
  90.         BNE.S   ne
  91.         SWAP    D1
  92.         SUBQ.W  #1,D0
  93.         BCS.S   e
  94.         DBRA    D1,l
  95.  
  96.         ; str1 zu Ende, str0 aber nicht
  97.         TST.B   (A0)+
  98.         BEQ.S   equ0
  99.         BRA.S   hi
  100.  
  101. equ1    ; str0 zu Ende, str1 prüfen
  102.         TST.B   (A1)+
  103.         BEQ.S   equ0
  104.         BRA.S   low
  105.  
  106. ne      MOVE.B  0(A2,D2.W),D1
  107.         MOVE.B  -(A1),D0
  108.         CMP.B   0(A2,D0.W),D1
  109.         BHI.S   hi
  110.         BCS.S   low
  111.         CMP.B   D0,D2   ; wenn Umlaute gleich, dann ASCII-Wert vergleichen
  112.         BHI.S   hi
  113.         BRA.S   low
  114.  
  115. e       ; str0 zu Ende, str1 prüfen
  116.         TST.W   D1
  117.         BEQ.S   equ0
  118.         TST.B   (A1)+
  119.         BNE.S   low
  120.  
  121. equ0    MOVE    #MagicStrings.equal,D0
  122.         BRA.S   end
  123. hi      MOVE    #MagicStrings.less,D0
  124.         BRA.S   end
  125. low     MOVE    #MagicStrings.greater,D0
  126. end     RTS
  127.  
  128. tab     DC.B    $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
  129.         DC.B    $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F
  130.         DC.B    $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F
  131.         DC.B    $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F
  132.         DC.B    $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F
  133.         DC.B    $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$5F
  134.  
  135.         DC.B    $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F
  136.         DC.B    $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F
  137.  
  138.         DC.B    'C','U','E','A','A','A','A','C','E','E','E','I','I','I','A','A'
  139.         DC.B    'E','A','A','O','O','O','U','U','Y','O','U',$9B,$9C,$9D,'s',$9F
  140.         DC.B    'A','I','I','U','N','N','A','O',$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF
  141.         DC.B    'A','O','O','O','O','O','A','A','O',$B9,$BA,$BB,$BC,$BD,$BE,$BF
  142.         DC.B    'I','I',$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF
  143.         DC.B    $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF
  144.         DC.B    $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF
  145.         DC.B    $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF
  146.     END
  147.   END StrICompare;
  148.  
  149. Die Funktion StrICompare macht einen Case-insensitiven Compare, und StrIequal
  150. macht halt einen Case-Insensitiven Vergleich. Die Rückgabewerte sind im Moment
  151. die von der MagicLib, aber das anzupassen ist ja Kinderkram. Außerdem geht die
  152. Ergebnisrückgabe im Moment über D0, das mußt Du dann noch an A3 anpassen.
  153.  
  154. Wenn Du Dich wunderst, warum da D1 geswapt wird: Das wird doppelt verwendet,
  155. zweimal für Worte. Ich hatte eigentlich mal D3 dafür verwendet (und natürlich
  156. auch gesichert und restauriert), aber damit hat mir irgendwas ab und zu D3
  157. zerstört und damit die Vergleiche zunichte gemacht! Ich habe keine Ahnung,
  158. woran das lag, aber so funktioniert es wenigstens!
  159.  
  160.  Gruß, Dirk
  161.